﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using MakeIT.MiraPark.Negocios;

namespace MiraPark
{
    public partial class FormManutencaoES : Form
    {
        private string operacao = "";

        public FormManutencaoES()
        {
            InitializeComponent();

        }

        private void FormManutencaoES_Load(object sender, EventArgs e)
        {
            //Popular listas
            List<CabineVO> listCabineVOs = ModelBO.getCabines();
            listCabineVOs.Add(CabineVO.CreateCabineVO(-1, "", -1));
            this.comboBoxCabineE.DataSource = listCabineVOs;

            List<CabineVO> listCabineVOs2 = ModelBO.getCabines();
            listCabineVOs2.Add(CabineVO.CreateCabineVO(-1, "", -1));
            this.comboBoxCabineS.DataSource = listCabineVOs2;

            List<ConvenioVO> listConvenioVOs = ModelBO.getConvenios(true);
            ConvenioVO convenioVO = ConvenioVO.CreateConvenioVO(-1, -1, -1);
            convenioVO.clienteVO.nome="";
            listConvenioVOs.Add(convenioVO);
            this.comboBoxConvenio.DataSource = listConvenioVOs;

            List<MensalistaVO> listMensalistaVOs = ModelBO.getMensalistas(true);
            MensalistaVO mensalistaVO = MensalistaVO.CreateMensalistaVO(-1, -1, -1);
            mensalistaVO.clienteVO.nome = "";
            listMensalistaVOs.Add(mensalistaVO);
            this.comboBoxMensalista.DataSource = listMensalistaVOs;

            List<IdValueVO> listEspecie = new List<IdValueVO>();
            listEspecie.Add(IdValueVO.CreateIdValueVO(MovimentacaoVO.Especie.Avulso, MovimentacaoVO.Especie.Avulso));
            listEspecie.Add(IdValueVO.CreateIdValueVO(MovimentacaoVO.Especie.Convenio, MovimentacaoVO.Especie.Convenio));
            listEspecie.Add(IdValueVO.CreateIdValueVO(MovimentacaoVO.Especie.Diaria, MovimentacaoVO.Especie.Diaria));
            listEspecie.Add(IdValueVO.CreateIdValueVO(MovimentacaoVO.Especie.DiariaEspecial, MovimentacaoVO.Especie.DiariaEspecial));
            listEspecie.Add(IdValueVO.CreateIdValueVO(MovimentacaoVO.Especie.Mensal, MovimentacaoVO.Especie.Mensal));
            listEspecie.Add(IdValueVO.CreateIdValueVO(MovimentacaoVO.Especie.Mensalidade, MovimentacaoVO.Especie.Mensalidade));
            listEspecie.Add(IdValueVO.CreateIdValueVO(MovimentacaoVO.Especie.Pendencia, MovimentacaoVO.Especie.Pendencia));
            listEspecie.Add(IdValueVO.CreateIdValueVO(MovimentacaoVO.Especie.Provisao, MovimentacaoVO.Especie.Provisao));
            listEspecie.Add(IdValueVO.CreateIdValueVO(MovimentacaoVO.Especie.Retirada, MovimentacaoVO.Especie.Retirada));
            this.comboBoxEspecie.DataSource = listEspecie;

            setupButtonsControls();
        }

        private void dataGridViewMovimentacao_SelectionChanged(object sender, EventArgs e)
        {
            setupButtonsControls();
        }

        private void buttonCancelar_Click(object sender, EventArgs e)
        {
            this.operacao = "cancelar";
            setupButtonsControls();
        }

        private void buttonEditar_Click(object sender, EventArgs e)
        {
            if (this.checkBoxCabine.Checked || this.checkBoxConvenio.Checked || this.checkBoxDiario.Checked)
            {
                MessageBox.Show("Fechamento já executado, edição não é permitida", "Aviso");
                return;
            }
            this.operacao = "editar";
            setupButtonsControls();
        }

        private void buttonExcluir_Click(object sender, EventArgs e)
        {
            if (this.checkBoxCabine.Checked || this.checkBoxConvenio.Checked || this.checkBoxDiario.Checked)
            {
                MessageBox.Show("Fechamento já executado, exclusão não é permitida", "Aviso");
                return;
            }
            this.operacao = "excluir";

            List<MovimentacaoVO> movimentacaoList = (List<MovimentacaoVO>)this.dataGridViewMovimentacao.DataSource;
            MovimentacaoVO movimentacaoVO = movimentacaoList[this.dataGridViewMovimentacao.CurrentRow.Index];
            DialogResult dr = MessageBox.Show(this, "Confirma a exclusão desta movimentação?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dr.ToString().Equals("Yes"))
            {
                ModelBO.delMovimentos(movimentacaoVO.movimentoVOs);
                ModelBO.delMovimentacao(movimentacaoVO);

                List<RecebimentoVO> listRecebimentoVOs = ModelBO.getRecebimentos(null, movimentacaoVO.idMovimentacao, null, null, false, false, null, null, null, null);
                if (listRecebimentoVOs != null && listRecebimentoVOs.Count > 0)
                    ModelBO.delRecebimentos(listRecebimentoVOs);

                int nRow = this.dataGridViewMovimentacao.CurrentRow.Index;
                buttonPesquisar_Click(sender, e);
                if (this.dataGridViewMovimentacao.Rows.Count > 0)
                {
                    dataGridViewMovimentacao.CurrentCell = dataGridViewMovimentacao.Rows[Math.Min(nRow, this.dataGridViewMovimentacao.Rows.Count - 1)].Cells[1];
                    dataGridViewMovimentacao.Rows[Math.Min(nRow, this.dataGridViewMovimentacao.Rows.Count - 1)].Selected = true;
                }

                setupButtonsControls();
            }
        }

        private void buttonSalvar_Click(object sender, EventArgs e)
        {
            String erros = "";
            DateTime? dtIni = null;
            DateTime? dtFim = null;

            try { dtIni = DateTime.Parse(this.maskedTextBoxDataIni.Text); }
            catch (Exception Exception)
            {
                erros = erros + "Data de Entrada com formato incorreto.\n";
            }
            DateTime dtFech = DateTime.Parse(ModelBO.getParametro(ParametroVO.parametros.FechamentoDiario));
            if (dtIni<= dtFech){
                erros = erros + "Data de Entrada deve ser maior que data de fechamento ("+dtFech.ToShortDateString()+").\n";
            }

            if ((int)comboBoxCabineE.SelectedValue == -1)
                erros = erros + "Cabine de entrada deve ser informada.\n";

            try { dtFim = DateTime.Parse(this.maskedTextBoxDataFim.Text); }
            catch (Exception Exception)
            {
                if (!this.maskedTextBoxDataFim.Text.Equals("  /  /       :  :"))
                    erros = erros + "Data Saida com formato incorreto.\n";
                else
                    dtFim = new DateTime(1, 1, 1);
            }
            if (dtFim != new DateTime(1, 1, 1) && (int)this.comboBoxCabineS.SelectedValue == -1)
            {
                erros = erros + "Informar a cabine de saida.\n";
            }
            if (dtFim != new DateTime(1, 1, 1) && dtIni > dtFim)
            {
                erros = erros + "Data de entrada maior que data de saída.\n";
            }

            //if ( this.numericUpDownValorCliente.Value <0 ){
            //    erros = erros + "Valor não pode ser negativo.\n";
            //}

            if (((string)this.comboBoxEspecie.SelectedValue).Equals(MovimentacaoVO.Especie.Mensal) &&
                (int)this.comboBoxMensalista.SelectedValue == -1)
            {
                erros = erros + "Movimento do tipo Mensalista sem mensalista informado.\n";
            }

            if (((string)this.comboBoxEspecie.SelectedValue).Equals(MovimentacaoVO.Especie.Convenio) &&
                (int)this.comboBoxConvenio.SelectedValue == -1)
            {
                erros = erros + "Movimento do tipo Convênio sem conveniado informado.\n";
            }

            if (((string)this.comboBoxEspecie.SelectedValue).Equals(MovimentacaoVO.Especie.Convenio) &&
                 dtFim == new DateTime(1, 1, 1))
            {
                erros = erros + "Para convênio deve ser informado data de saída.\n";
            }

           
            if (erros.Length > 0)
            {
                MessageBox.Show(this, erros, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            MovimentacaoVO movimentacaoVO = null;

          if (this.operacao.Equals("editar"))
            {
                List<MovimentacaoVO> listMovimenacaoVO = (List<MovimentacaoVO>)this.dataGridViewMovimentacao.DataSource;
                movimentacaoVO = listMovimenacaoVO[this.dataGridViewMovimentacao.CurrentRow.Index];

                movimentacaoVO.entrada = dtIni.Value;
                movimentacaoVO.idCabineE = (int)this.comboBoxCabineE.SelectedValue;
                movimentacaoVO.saida = dtFim.Value;
                movimentacaoVO.idCabineS = (int)this.comboBoxCabineS.SelectedValue;
                movimentacaoVO.especie = (string)this.comboBoxEspecie.SelectedValue;
                movimentacaoVO.idConvenio = (int)this.comboBoxConvenio.SelectedValue;
                movimentacaoVO.idMensalista = (int)this.comboBoxMensalista.SelectedValue;
                movimentacaoVO.obs = this.textBoxObs.Text;
                movimentacaoVO.valor = this.numericUpDownValorCliente.Value;
                
                ModelBO.setMovimentacao(movimentacaoVO);

                // salvar movimentos
                ModelBO.delMovimentos(movimentacaoVO.movimentoVOs);
                movimentacaoVO.movimentoVOs.Clear();
                MovimentoVO movimentoVO = MovimentoVO.CreateMovimentoVO();

                //movimentoVO.idMovimento=;
                movimentoVO.idMovimentacao=movimentacaoVO.idMovimentacao;
                movimentoVO.especie = this.comboBoxEspecie.SelectedText;
                movimentoVO.idTabelaAvulso = -1;
                movimentoVO.idTabelaConvenio = -1;
                movimentoVO.idTabelaConvenioP = -1;
                movimentoVO.idTabelaMensal = -1;
                movimentoVO.periodo = "Especial";
                movimentoVO.valor = this.numericUpDownValorCliente.Value;
                movimentoVO.valorConvenio = this.numericUpDownValorConvenio.Value;
                movimentoVO.valorConvenioExtra = this.numericUpDownValorConvenioExtra.Value;
                movimentacaoVO.movimentoVOs.Add(movimentoVO);
                ModelBO.newMovimentos(movimentacaoVO.movimentoVOs);

                //refazer recebimento
                List<RecebimentoVO> listRecebimentoVOs = ModelBO.getRecebimentos(null, movimentacaoVO.idMovimentacao, null, null, false, false, null, null, null, null);
                if (listRecebimentoVOs != null && listRecebimentoVOs.Count > 0)
                {
                    RecebimentoVO recebimentoVO = listRecebimentoVOs[0];
                    recebimentoVO.idConvenio = (int)this.comboBoxConvenio.SelectedValue;
                    recebimentoVO.idMensalista = (int)this.comboBoxMensalista.SelectedValue;
                    recebimentoVO.valor = this.numericUpDownValorCliente.Value + this.numericUpDownValorConvenio.Value + this.numericUpDownValorConvenioExtra.Value;
                    ModelBO.setRecebimento(recebimentoVO);
                }

            }

            this.operacao = "salvar";

            buttonPesquisar_Click(sender, e);


            List<MovimentacaoVO> listMovimentacaoVOs = (List<MovimentacaoVO>)dataGridViewMovimentacao.DataSource;
            int nRow = listMovimentacaoVOs.FindIndex(a => a.idMovimentacao == movimentacaoVO.idMovimentacao);
            if (nRow != -1)
            {
                dataGridViewMovimentacao.CurrentCell = dataGridViewMovimentacao.Rows[nRow].Cells[1];
                dataGridViewMovimentacao.Rows[nRow].Selected = true;
            }

            setupButtonsControls();
        }

        private void setupButtonsControls()
        {
            bool haRows = this.dataGridViewMovimentacao.Rows.Count > 0 && this.dataGridViewMovimentacao.CurrentRow != null;
            bool novo = this.operacao.Equals("novo");
            bool edit = this.operacao.Equals("editar");
            bool canc = this.operacao.Equals("cancelar");

            this.buttonCancelar.Enabled = edit;
            this.buttonEditar.Enabled = haRows && !edit;
            this.buttonExcluir.Enabled = haRows && !edit;
            this.buttonSalvar.Enabled = edit;

            this.maskedTextBoxDataIni.Enabled = edit;
            this.comboBoxCabineE.Enabled = edit;
            this.maskedTextBoxDataFim.Enabled = edit;
            this.comboBoxCabineS.Enabled = edit;
            this.comboBoxEspecie.Enabled = edit;
            this.comboBoxConvenio.Enabled = edit;
            this.comboBoxMensalista.Enabled = edit;
            this.numericUpDownValorCliente.Enabled = edit;
            this.numericUpDownValorConvenio.Enabled = edit && (int)this.comboBoxConvenio.SelectedValue!=-1;
            this.numericUpDownValorConvenioExtra.Enabled = edit && (int)this.comboBoxConvenio.SelectedValue != -1;
            this.textBoxObs.Enabled = edit;

            this.dataGridViewMovimentacao.Enabled = !edit;

            if (!haRows)
            {
                this.textBoxId.Text = "";
                this.textBoxTicket.Text = "";
                this.textBoxPlaca.Text = "";
                this.maskedTextBoxDataIni.Text = "";
                this.comboBoxCabineE.SelectedValue = -1;
                this.maskedTextBoxDataFim.Text = "";
                this.comboBoxCabineS.SelectedValue = -1;
                this.comboBoxEspecie.SelectedValue = MovimentacaoVO.Especie.Avulso;
                this.comboBoxConvenio.SelectedValue = -1;
                this.comboBoxMensalista.SelectedValue = -1;
                this.numericUpDownValorCliente.Value = 0;
                this.numericUpDownValorConvenio.Value = 0;
                this.numericUpDownValorConvenioExtra.Value = 0;
                this.textBoxObs.Text = "";
                this.checkBoxCabine.Checked = false;
                this.checkBoxConvenio.Checked = false;
                this.checkBoxDiario.Checked = false;

            }
            else
            {
                List<MovimentacaoVO> listMovimentacaoVOs = (List<MovimentacaoVO>)this.dataGridViewMovimentacao.DataSource;
                MovimentacaoVO movimentacaoVO = listMovimentacaoVOs[this.dataGridViewMovimentacao.CurrentRow.Index];
                this.textBoxId.Text = movimentacaoVO.idMovimentacao.ToString();
                this.textBoxTicket.Text = movimentacaoVO.ticket.ToString();
                this.textBoxPlaca.Text = movimentacaoVO.placa;
                this.maskedTextBoxDataIni.Text = movimentacaoVO.entrada.ToString();
                this.comboBoxCabineE.SelectedValue = movimentacaoVO.idCabineE;
                if (movimentacaoVO.saida != new DateTime(1, 1, 1))
                    this.maskedTextBoxDataFim.Text = movimentacaoVO.saida.ToString();
                else
                    this.maskedTextBoxDataFim.Text = "";
                this.comboBoxCabineS.SelectedValue = movimentacaoVO.idCabineS;
                this.comboBoxEspecie.SelectedValue = movimentacaoVO.especie;
                this.comboBoxConvenio.SelectedValue = movimentacaoVO.idConvenio;
                this.comboBoxMensalista.SelectedValue = movimentacaoVO.idMensalista;
                this.numericUpDownValorCliente.Value = movimentacaoVO.valor;
                this.numericUpDownValorConvenio.Value = 0.0M;
                this.numericUpDownValorConvenioExtra.Value = 0.0M;
                this.textBoxObs.Text = movimentacaoVO.obs;
                this.checkBoxCabine.Checked = movimentacaoVO.fechCabine;
                this.checkBoxConvenio.Checked = movimentacaoVO.fechConvenio;
                this.checkBoxDiario.Checked = movimentacaoVO.fechDiario;

            }
            if (edit)
            {
                this.maskedTextBoxDataIni.Focus();
            }
        }

        private void dataGridViewMovimentacao_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            //DataGridView dgv = (DataGridView)sender;
            //foreach (DataGridViewRow dgvr in dgv.Rows)
            //{
            //    MensalistaVO cvo = (MensalistaVO)dgvr.DataBoundItem;
            //    dgvr.Cells["cliente"].Value = cvo.clienteVO.nome;
            //    dgvr.Cells["tabelaMensal"].Value = cvo.tabelaMensalVO.tabelaMensal;
            //}

        }

        private void buttonPesquisar_Click(object sender, EventArgs e)
        {
            DateTime? dataIni = null;
            DateTime? dataFim = null;
            string placa = null;
            int? ticket = null;

            try { dataIni = DateTime.Parse(this.maskedTextBoxDataIniP.Text ); } catch (Exception ex) {}  ;
            try { dataFim = DateTime.Parse(this.maskedTextBoxDataFimP.Text ); } catch (Exception ex) {}  ;

            if ( this.textBoxPlacaP.Text.Trim().Length>0 )
                placa = this.textBoxPlacaP.Text;

            if ( this.numericUpDownTicketP.Value >0)
                ticket = (int)this.numericUpDownTicketP.Value;

            if (dataIni == null && dataFim == null && placa == null && ticket == null)
            {
                MessageBox.Show("Informe ao menos um filtro para pesquisa", "Aviso");
                return;
            }

            this.dataGridViewMovimentacao.DataSource = ModelBO.getMovimentacoes(null, null, null, dataIni, dataFim,
                placa, ticket, false, false, null, true, false, false, false, true);
        }

        private void comboBoxEspecie_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (!((string)this.comboBoxEspecie.SelectedValue).Equals(MovimentacaoVO.Especie.Mensal) ||
                ((string)this.comboBoxEspecie.SelectedValue).Equals(MovimentacaoVO.Especie.Convenio)){
                this.comboBoxMensalista.SelectedValue = -1;
                this.comboBoxConvenio.SelectedValue = -1;
                this.numericUpDownValorConvenio.Enabled = false;
                this.numericUpDownValorConvenio.Value = 0.0M;
                this.numericUpDownValorConvenioExtra.Enabled = false;
                this.numericUpDownValorConvenioExtra.Value = 0.0M;
                }
            if (((string)this.comboBoxEspecie.SelectedValue).Equals(MovimentacaoVO.Especie.Mensal))
            {
                this.comboBoxConvenio.SelectedValue = -1;
                this.numericUpDownValorConvenio.Enabled = false;
                this.numericUpDownValorConvenio.Value = 0.0M;
                this.numericUpDownValorConvenioExtra.Enabled = false;
                this.numericUpDownValorConvenioExtra.Value = 0.0M;
            }
            if (((string)this.comboBoxEspecie.SelectedValue).Equals(MovimentacaoVO.Especie.Convenio))
            {
                this.comboBoxMensalista.SelectedValue = -1;
                if (this.operacao.Equals("editar")){
                    this.numericUpDownValorConvenio.Enabled = true;
                    this.numericUpDownValorConvenioExtra.Enabled = true;
                }
            }
        }

        private void comboBoxConvenio_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.comboBoxConvenio.Items.Count > 0 && (int)this.comboBoxConvenio.SelectedValue != -1)
            {
                this.comboBoxEspecie.SelectedValue = MovimentacaoVO.Especie.Convenio;
                this.comboBoxMensalista.SelectedValue = -1;
            }
        }

        private void comboBoxMensalista_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.comboBoxMensalista.Items.Count > 0 && (int)this.comboBoxMensalista.SelectedValue != -1)
            {
                this.comboBoxEspecie.SelectedValue = MovimentacaoVO.Especie.Mensal;
                this.comboBoxConvenio.SelectedValue = -1;
            }
        }

     }
}
